package adapter

//Target 是适配的目标接口
type Target interface {
	Request() string
}

//Adapter 是被适配的目标接口
type Adaptee interface {
	SpecficRequest() string
}

//NewAdapter 是被适配器接口的工厂函数
func NewAdaptee() Adaptee {
	return &adapteeImpl{}
}

type adapteeImpl struct{}

//需要代理的适配的对象 当前接口需要的上面的不适配器
func (*adapteeImpl) SpecficRequest() string {
	return "adaptee method"
}

//NewAdapeyer 是目标类的一个方法
//其实很简单的方式
// type interface
// impl->interface
// adpetr address adir
// Tagfer
// return
// a.impl add:addtet
// rquets
// a.add.spoencirequest
// requiest

func NewAdapter(adptee Adaptee) Target {
	return &adapter{
		adptee,
	}
}

type adapter struct {
	Adaptee
}

func (a *adapter) Request() string {
	return a.SpecficRequest()
}

type Login interface {
	LoginHandleSync(username, pwd string) (bool, error)
}
type LoginAdaper struct {
	QQLogin
}

func NewLog(qq QQLogin) Login {
	return &LoginAdaper{qq}
}
func (l *LoginAdaper) LoginHandleSync(username, pwd string) (bool, error) {
	return l.Login(username, pwd), nil
}

//我们的接口
type QQLogin interface {
	Login(username, pwd string) bool
}
type QQImpl struct {
}

func NewQQlogin() QQLogin {
	return &QQImpl{}
}

func (qq *QQImpl) Login(username, pwd string) bool {
	return true
}
